#include <stdio.h>
#include <stdlib.h>
#define SIZE 13
int UFSets[SIZE];

void Initial(int[]);//并查集初始化
int Find(int [],int);//查操作，返回x所属根结点
void Union(int [],int,int);//并操作，把两个集合合并为一个
int main()
{

    return 0;
}
void Initial(int S[])//并查集初始化
{
    for(int i = 0;i < SIZE;i++)
    {
        S[i] = -1;
    }
}
int Find(int S[],int x)//查操作，返回x所属根结点。优化后，在查找到根结点之后，再压缩路径
{
    int root = x;   
    while(S[root]>=0)
    {
        root = S[root];
    }//循环找到根结点
    while(x != root)
    {
        int t = S[x];//t指向x父结点
        S[x] = root;//x直接挂在根结点下
        x = t;//操作对象向上，变为父结点
    }
    return root;//返回根结点编号
}
void Union(int S[],int Root1,int Root2)//并操作,把两个集合合并为一个。优化后，把小树合并到大树
{
    if(Root1 == Root2)
        return;
    if(S[Root2] > S[Root1])//如果Root2比Root1小(根结点值为负数，其绝对值代表该树总结点数)
    {
        S[Root1] += S[Root2];//累加结点总数
        S[Root2] = Root1;//把小树合并到大树
    }
    else
    {
        S[Root2] += S[Root1];
        S[Root1] = Root2;
    }
}
